// common.h
#pragma once

#include <cstdint>  // 使用标准整数类型，确保跨平台一致性
#include <cstddef>  // 使用 size_t
// xxxx
/**
 * @brief 全局常量与类型定义
 * 本文件包含数据库系统中各模块共享的基础类型和无效值常量
 * 避免重复定义，降低模块间耦合
 */

// -----------------------------
// 通用类型别名 (Type Aliases)
// -----------------------------

using page_id_t  = uint32_t;   // 页标识符，唯一标识一个磁盘页
using frame_id_t = int32_t;   // 帧标识符，标识缓冲池中的一个槽位（frame）
using lsn_t      = int64_t;   // 日志序列号（Log Sequence Number），用于WAL日志

// -----------------------------
// 无效标识符常量
// -----------------------------

static constexpr page_id_t  INVALID_PAGE_ID  = 0;  // 表示无效或未分配的页ID
static constexpr frame_id_t INVALID_FRAME_ID = -1;  // 表示无可用帧或替换失败
static constexpr lsn_t      INVALID_LSN      = -1;  // 表示无日志记录

// -----------------------------
// 页大小常量（可选）
// -----------------------------

static constexpr size_t PAGE_SIZE = 4096;  // 4KB 页面，常见数据库页大小
// 可根据需要改为 8KB (8192) 或 16KB (16384)

// -----------------------------
// 其他通用常量（可扩展）
// -----------------------------

static constexpr size_t BUFFER_POOL_MIN_SIZE = 1;   // 缓冲池最小大小
static constexpr size_t BUFFER_POOL_MAX_SIZE = 65536; // 例如 64KB 页 × 64K = 256GB 缓存（理论值）

// -----------------------------
// 工具宏（可选）
// -----------------------------

/**
 * @brief 断言表达式并输出文件行号（调试用）
 * 可替换为更复杂的日志系统
 */
#ifdef DEBUG
#define DB_ASSERT(expr) \
    do { \
        if (!(expr)) { \
            fprintf(stderr, "Assertion failed: %s at %s:%d\n", #expr, __FILE__, __LINE__); \
            std::abort(); \
        } \
    } while(0)
#else
#define DB_ASSERT(expr) (void)(expr)  // Debug 模式下不执行
#endif